001 /*
002 * Copyright 2005 Stephen J. McConnell
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.library.info;
020
021 import java.io.Serializable;
022 import java.util.Properties;
023
024 /**
025 * The ModuleDirective class describes a module data-structure.
026 *
027 * @author <a href="http://www.dpml.net">The Digital Product Meta Library</a>
028 * @version 1.0.0
029 */
030 public abstract class AbstractDirective implements Serializable
031 {
032 private Properties m_properties;
033
034 /**
035 * Creation of a new abstract directive.
036 */
037 public AbstractDirective()
038 {
039 this( null );
040 }
041
042 /**
043 * Creation of a new abstract directive.
044 * @param properties the properties associated with the directive
045 */
046 public AbstractDirective( Properties properties )
047 {
048 if( null == properties )
049 {
050 m_properties = new Properties();
051 }
052 else
053 {
054 m_properties = properties;
055 }
056 }
057
058 /**
059 * Return a property value.
060 * @param key the property key
061 * @return the property value
062 */
063 public String getProperty( String key )
064 {
065 return m_properties.getProperty( key );
066 }
067
068 /**
069 * Return a property set.
070 * @return the properties
071 */
072 public Properties getProperties()
073 {
074 return m_properties;
075 }
076
077 /**
078 * Compare this object to the supplied object for equality.
079 * @param other the other object
080 * @return true if equal
081 */
082 public boolean equals( Object other )
083 {
084 if( null == other )
085 {
086 return false;
087 }
088 else
089 {
090 return ( other instanceof AbstractDirective );
091 }
092 }
093
094 /**
095 * Calculate the hashcode.
096 * @return the hashcode value
097 */
098 public int hashCode()
099 {
100 return getClass().hashCode();
101 }
102
103 /**
104 * Utility to hash an array.
105 * @param array the array
106 * @return the hash value
107 */
108 protected int hashArray( Object[] array )
109 {
110 if( null == array )
111 {
112 return 0;
113 }
114 int hash = 0;
115 for( int i=0; i<array.length; i++ )
116 {
117 Object object = array[i];
118 hash ^= hashValue( object );
119 }
120 return hash;
121 }
122
123 /**
124 * Utility to hash an object.
125 * @param value the object
126 * @return the hash value
127 */
128 protected int hashValue( Object value )
129 {
130 if( null == value )
131 {
132 return 0;
133 }
134 else if( value instanceof Object[] )
135 {
136 return hashArray( (Object[]) value );
137 }
138 else
139 {
140 return value.hashCode();
141 }
142 }
143
144 /**
145 * Utility to compare two object for equality.
146 * @param a the first object
147 * @param b the second object
148 * @return true if the objects are equal
149 */
150 protected boolean equals( Object a, Object b )
151 {
152 if( null == a )
153 {
154 return ( null == b );
155 }
156 else
157 {
158 return a.equals( b );
159 }
160 }
161 }